/*/request*/
import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'

const service = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API || 'http://localhost:8082',  // 基础请求URL
    timeout: 30000  // 请求超时时间
})

// 定义白名单，请求这些接口不需要携带 token
const whiteList = [
    '/auth/login',
    '/captcha',
    // 其他不需要认证的接口
]

// 统一处理未授权情况（如 token 过期）
const handleUnauthorized = () => {
    // 清除本地保存的 token
    localStorage.removeItem('token')

    // 避免重复跳转
    const currentRoute = router.currentRoute.value
    if (currentRoute.name !== 'Login' && !currentRoute.path.startsWith('/login')) {
        // 跳转到登录页面
        router.replace({
            name: 'Login',
            query: { redirect: currentRoute.fullPath }
        }).catch(() => {
            // 防止重复导航错误
        })
    }

    // 提示用户登录已过期
    ElMessage.warning('登录已过期，请重新登录')
}

// 请求拦截器：添加 token
service.interceptors.request.use(
    config => {
        // 检查是否是白名单请求
        if (whiteList.some(path => config.url.includes(path))) {
            return config  // 白名单请求不需要 token
        }

        // 从 localStorage 获取 token
        const token = localStorage.getItem('token')

        // 如果 token 存在且格式正确，添加到请求头
        if (token && typeof token === 'string' && token.trim() !== '' && token.split('.').length === 3) {
            config.headers['Authorization'] = `Bearer ${token}`
        } else {
            // 没有有效的 token 时，中断请求并跳转到登录页
            handleUnauthorized()
            return Promise.reject(new Error('无效的认证令牌'))
        }

        return config
    },
    error => {
        // 请求失败时处理
        return Promise.reject(error)
    }
)

// 响应拦截器：处理 401 未授权
service.interceptors.response.use(
    response => {
        // 处理业务层的错误代码（如 401）
        const data = response.data
        if (data && data.code === 401) {
            handleUnauthorized()
            return Promise.reject(new Error('未授权'))
        }
        return response  // 如果没有错误，继续正常返回响应数据
    },
    error => {
        // 处理 HTTP 错误
        if (error.response) {
            const status = error.response.status

            // 根据 HTTP 状态码做错误处理
            if (status === 401) {
                handleUnauthorized()  // 如果是 401 错误，直接处理未授权
                return Promise.reject(new Error('未授权'))
            }

            let message = '请求失败'

            switch (status) {
                case 400: message = '请求参数错误'; break
                case 403: message = '拒绝访问'; break
                case 404: message = '资源不存在'; break
                case 500: message = '服务器内部错误'; break
            }

            // 使用后端返回的错误信息（如果有）
            if (error.response.data?.message) {
                message = error.response.data.message
            }

            // 显示错误信息
            ElMessage.error(message)
        } else if (error.request) {
            // 请求发送成功，但没有收到响应（可能是网络问题）
            ElMessage.error('服务器响应超时，请检查网络连接')
        } else {
            // 请求配置错误（比如 url 错误）
            ElMessage.error('请求配置错误')
        }

        // 抛出错误，以便进一步处理
        return Promise.reject(error)
    }
)

export default service
